home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Pascal Super Library
/
Pascal Super Library (CW International)(1997).bin
/
LIBRARY
/
PASCALL
/
VIDEO
/
FVID.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-06-16
|
4KB
|
153 lines
unit FVid;
interface
uses
Crt,FPal,Objects;
const
BlendFrames = 10;
BlendColors = 10;
DivitnBlends = 3*BlendColors;
type
AFPRgbs=array[0..DivitnBlends] of RFPRgb;
PDeveder=^TDeveder;
TDeveder=object(TObject)
Blends : AFPRgbs;
constructor Init;
procedure Get(n:Integer; var A:RFPRgb); virtual;
end;
PVid=^TVid;
TVid=object(TObject)
Blendes : TDeveder;
Orig ,
Access : TFPPal;
At1 ,
At2 : Integer;
constructor Init(n:Byte);
procedure Bo; virtual;
destructor Done; virtual;
end;
implementation
{TObject.TDeveder}
constructor TDeveder.Init;
procedure Build(var Z:AFPRgbs; A,B:Integer);
begin
if ((A+B) div 2<>A) and ((A+B) div 2<>B) then
begin
Z[(A+B) div 2].Red :=Z[A].Red +Z[B].Red;
Z[(A+B) div 2].Green:=Z[A].Green+Z[B].Green;
Z[(A+B) div 2].Blue :=Z[A].Blue +Z[B].Blue;
Build(Z,A,(A+B) div 2);
Build(Z,(A+B) div 2,B);
end;
end;
procedure AverageOut(var Z:AFPRgbs);
var
a:Integer;
b:Real;
begin
for a:=0 to DivitnBlends do
begin
with Z[A] do
begin
b:=0;
if Red>b then b:=Red;
if Green>b then b:=Green;
if Blue>b then b:=Blue;
if b>0 then
begin
Red:=100*(Red/b);
Green:=100*(Green/b);
Blue:=100*(Blue/b);
end;
end;
end;
end;
begin
inherited Init;
Blends[0].Red:=1;
Blends[DivitnBlends div 3].Green:=1;
Blends[2*(DivitnBlends div 3)].Blue:=1;
Blends[DivitnBlends].Red:=1;
Build(Blends,0,DivitnBlends div 3);
Build(Blends,DivitnBlends div 3,2*(DivitnBlends div 3));
Build(Blends,2*(DivitnBlends div 3),DivitnBlends);
AverageOut(Blends);
end;
procedure TDeveder.Get(n:Integer; var A:RFPRgb);
begin
A:=Blends[n];
end;
{TObject.TVid}
constructor TVid.Init(n:Byte);
begin
inherited Init;
Blendes.Init;
Orig.Init(n);
Orig.Copy;
Access.Init(n);
Access.Copy;
end;
procedure TVid.Bo;
var
A,B,C:RFPRgb;
function Incr(A:Integer; B,C:Real):Real;
var
t:Real;
begin
t:=B-C;
Incr:=B-(((A)*t)/BlendFrames);
end;
procedure Incre(A:Integer; var B,C,D:RFPRgb);
begin
D.Red:= Incr(A,B.Red,C.Red);
D.Green:=Incr(A,B.Green,C.Green);
D.Blue:= Incr(A,B.Blue,C.Blue);
end;
procedure updatergb(a:integer; b,c,d:real);
begin
gotoxy(1,1);
write('Color:');
writeln(a:24);
gotoxy(1,3);
write('RED:');
writeln(b:26:10);
gotoxy(1,4);
write('GREEN:');
writeln(c:24:10);
gotoxy(1,5);
write('BLUE:');
writeln(d:25:10);
end;
begin
Blendes.Get(At1,A);
Blendes.Get(At1+1,B);
Incre(At2,A,B,C);
with C do
begin
Access.This(Red,Green,Blue);
{ UpDateRgb(0,Red,Green,Blue);}
end;
Inc(At2);
if At2=BlendFrames+1 then
begin
Inc(At1);
At2:=0;
end;
if At1=DivitnBlends then At1:=0;
end;
destructor TVid.Done;
begin
Orig.Push;
inherited Done;
end;
end.